package data

import (
	"strings"

	"gitee.com/small_fish_official_net/beego_frame/bash"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/orm"
)

type Menu struct {
	Id       int64  `json:"id"`    // 菜单编号
	Title    string `json:"title"` // 菜单显示名称
	Icon     string `json:"icon"`  // 菜单显示icon
	Url      string `json:"url"`   // 菜单跳转地址
	IsHidden bool   `json:"-"`     // 是否显示该菜单，若设置了该选项则表示无需添加即可默认拥有该权限
	Order    uint   `json:"-"`     // 菜单排序
	Superior int64  `json:"-"`     // 上级菜单编号
	Data
}

func menu_init() {
	o := orm.NewOrm()
	bash.UseType(o, "write")
	o.Begin()
	menu := map[string]map[string]string{
		"&#xe66a;:后台配置:100": map[string]string{
			"&#xe770;:group/list:100": "用户组配置",
			"&#xe66f;:group/user:99":  "后台用户配置",
			"group/list_add":          "添加用户组配置", // hidden隐藏菜单
		},
	}
	for u1, v1 := range menu {
		u1_list := strings.Split(u1, ":")
		tm := Menu{Title: u1_list[1], Icon: u1_list[0], Order: bash.StringToUint(u1_list[2]), Url: "", Superior: 0}
		tm.InsertPrivate()
		id, err := o.Insert(&tm)
		if err != nil {
			logs.Error("数据库插入失败，原因：" + err.Error())
			o.Rollback()
			return
		}
		for u2, v2 := range v1 {
			u2_list := strings.Split(u2, ":")
			tm := Menu{}
			if len(u2_list) == 1 {
				// 如果只有一个元素则表示是隐藏菜单
				tm = Menu{Title: v2, Url: u2_list[0], Superior: id, IsHidden: true}
			} else {
				tm = Menu{Title: v2, Icon: u2_list[0], Order: bash.StringToUint(u2_list[2]), Url: u2_list[1], Superior: id}
			}
			tm.InsertPrivate()
			_, err := o.Insert(&tm)
			if err != nil {
				logs.Error("数据库插入失败，原因：" + err.Error())
				o.Rollback()
				return
			}
		}
	}
	// 隐藏菜单添加
	for url, value := range map[string]string{
		"main":             "后台面板",
		"":                 "后台基本框架",
		"login":            "登录页面",
		"logout":           "退出登录页面",
		"setting/basic":    "基本资料",
		"setting/security": "安全设置",
	} {
		m1 := Menu{Title: value, Url: url, IsHidden: true, Superior: 0}
		m1.InsertPrivate()
		_, err := o.Insert(&m1)
		if err != nil {
			o.Rollback()
			logs.Error("菜单数据插入失败：" + err.Error())
			return
		}
	}
	o.Commit()
	return
}
